package com.levi.config;

import org.springframework.amqp.rabbit.connection.CorrelationData;
import org.springframework.amqp.rabbit.core.RabbitTemplate;

/**
 * 保证消息可靠性无非就两种，消息可靠生产和消息可靠消费
 * 消息确认回调方法  解决可靠生产的问题
 * 1.在本地数据库建一张消息冗余表，比如保存订单时候把订单信息在消息冗余表中也保存一份，用于回查
 * 2.如果ack为true说明交换机收到了消息，就把状态改为0
 * 3.如果ack为false 说明交换机没有收到消息，就把状态改为1，再用定时器定时再次发送消息
 * 4.如果消息发送多次还是没有发送成功就把状态改为2，这时候就根据业务需要人工确认
 *
 */
public class MessageConfirmCallback implements RabbitTemplate.ConfirmCallback {

    @Override
    public void confirm(CorrelationData correlationData, boolean ack, String cause) {
        String orderId = correlationData.getId();
        System.out.println("orderId: "+orderId);
        //ack为false，交换机应答失败
        if (!ack) {
            //没有投递成功的消息写一个task定时检查本地消息冗余表，再次发送
            System.out.println("消息投递失败");
            return;
        }
        //ack为true，交换机应答成功，消息收到
        try {
            //修改消息冗余表的状态为收到消息   业务逻辑
            System.out.println("消息成功投递 >>>>> 本地消息表修改成功");
        }catch (Exception e){
            System.out.println("本地消息表修改失败，出现异常: "+e.getMessage());
        }
    }
}
